home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 140
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin
/
tools
/
dshell
/
dsh333bs.lzh
/
bookmark.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-07-11
|
5KB
|
280 lines
/*
dshell v3
しおり機能
過去に読んだことがあるテキストの表示開始位置を
記憶しておき、反映するためのしかけ
*/
#include "dsh.h"
#define DEBUG FALSE
#define USE_HEAP FALSE // TRUE...ワークをヒープから確保 / FALSE...静的確保
typedef struct {
short no; /* 次のbookmark番号(list構造もどき) */
unsigned short crc; /* ファイルのCRC(ID) */
int ln; /* 表示開始行番号(保存) */
char *fnm; /* ファイル名へのポインタ~ */
} BOOKMARK;
#define USEHPSIZ 2048 /* bookmarkで使用するHEAPのサイズ */
#define BKMKMAX ((USEHPSIZ - 16) / sizeof(BOOKMARK))
/* しおりの最大個数(-16は管理用?領域分) */
#if USE_HEAP
static BOOKMARK *bookmark;
#else
static BOOKMARK bookmark[BKMKMAX];
#endif
static short IMAmark = -1; /* 現在読込中のテキスト分のmark(list先頭) */
static short KAKOmark = -1; /* 過去読込済のテキスト分のmark(list先頭) */
static short NILmark = -1; /* 未使用分のmark(list先頭) */
/*
しおりの初期化
記憶用領域はcmalloc()で確保
(どうも挙動不審(?)なんだけど…小さいめなら大丈夫か?)
このファイル内の関数群を実行する前に必ず一度
この初期化が実行されていなければならない
*/
int
init_bookmark(void)
{
int i;
#if USE_HEAP
/* printf("BKMKMAX=%x, sizeof(BOOKMARK)=%x\n", BKMKMAX, sizeof(BOOKMARK)); */
bookmark = (BOOKMARK *) calloc(BKMKMAX, sizeof(BOOKMARK));
if (bookmark == NULL) {
return 1;
}
#endif
NILmark = 0;
for (i = 0; i < (BKMKMAX - 1); i++) {
bookmark[i].no = i + 1;
}
bookmark[BKMKMAX - 1].no = -1;
#if DEBUG
dbg1("init_bookmark");
#endif
return 0;
}
/*
渡されたリストから、crcが合致するものを探す
有ったらしおりID(0~)、無かったら-1を返す
*/
static int
getno_sub(unsigned short crc, short startmark)
{
int i = startmark;
while (i >= 0) {
if (bookmark[i].crc == crc) {
break;
}
i = bookmark[i].no;
}
return i;
}
/*
現在読み込まれ中のファイルかチェック
そうだったらしおりID(0~)違ったら-1を返す
*/
int
crc_to_IMAno(unsigned short crc)
{
return getno_sub(crc, IMAmark);
}
/*
過去読み込まれたファイルかチェック
そうだったらしおりID(0~)違ったら-1を返す
*/
int
crc_to_KAKOno(unsigned short crc)
{
return getno_sub(crc, KAKOmark);
}
/*
空リストを1コつぶし、現リストに追加(行番号初期化)
ない場合は過去リストより古い順にツブす
戻り値:しおりID (エラーの時は-1)
*/
int
regist_IMAmark(unsigned short crc)
{
int i, n;
n = NILmark;
if (n == -1) {
n = KAKOmark;
if (n == -1) { /* 読込ファイルMAXよりリストMAXが多ければ起こりえないエラー */
return -1;
}
KAKOmark = bookmark[n].no;
} else {
NILmark = bookmark[n].no;
}
i = IMAmark;
if (i >= 0) {
while (bookmark[i].no != -1) {
i = bookmark[i].no;
}
bookmark[i].no = n;
} else {
IMAmark = n;
}
bookmark[n].no = -1;
bookmark[n].crc = crc;
bookmark[n].ln = 0;
#if DEBUG
dbg1("regist_IMAmark");
#endif
return n;
}
/*
指定のしおりIDのbookmarkを現リストから外し、
過去リスト(のしっぽ)にくっつける
戻り値:errorの時 -1
*/
int
IMAtoKAKO(int n)
{
int i;
if (n < 0 || n >= BKMKMAX) {
return -1;
}
i = IMAmark;
while (i != -1) {
if (bookmark[i].no == n) {
break;
}
i = bookmark[i].no;
}
if (i == -1) {
return -1; /* 現リスト中に指定のIDのしおりがなかった */
}
bookmark[i].no = bookmark[n].no;
i = KAKOmark;
if (i >= 0) {
while (bookmark[i].no != -1) {
i = bookmark[i].no;
}
bookmark[i].no = n;
} else {
KAKOmark = n;
}
bookmark[n].no = -1;
#if DEBUG
dbg1("IMAtoKAKO");
#endif
return 0;
}
/*
指定IDのしおりに、
指定の行番号をストアする
*/
int
put_ln(int no, int ln)
{
if (no < 0 || no >= BKMKMAX) {
return -1;
}
bookmark[no].ln = ln;
return 0;
}
/*
指定IDのしおりから
行番号をゲットする
*/
int
get_ln(int no)
{
int lno;
if (no < 0 || no >= BKMKMAX) {
return -1;
}
lno = bookmark[no].ln;
if (lno >= lpmx)
lno = 0;
return lno;
}
/*
ファイル名へのポインタをセット
*/
int
set_fnm_to_mark(int n, char *fname)
{
if (n < 0 || n >= BKMKMAX) {
return -1;
}
bookmark[n].fnm = fname;
return 0;
}
#if DEBUG
int
dbg1sub(short markhd, FILE *fp)
{
int i;
i = markhd;
while (i != -1) {
fprintf(fp, " %d(%s)>", i, bookmark[i].fnm);
i = bookmark[i].no;
}
fprintf(fp, " >END\n");
}
int
dbg1(char *nm)
{
FILE *fp;
fp = fopen("g:/bmdebug", "a");
if (fp == NULL) {
return;
}
fprintf(fp, "%s\n", nm);
fprintf(fp, " IMAmark:\n");
dbg1sub(IMAmark, fp);
fprintf(fp, " KAKOmark:\n");
dbg1sub(KAKOmark, fp);
fprintf(fp, " NILmark:\n");
dbg1sub(NILmark, fp);
fprintf(fp, "\n");
fclose(fp);
}
#endif